<?php

use Workerman\Worker;
use PHPSocketIO\SocketIO;

require_once __DIR__ . '/vendor/autoload.php';
// 全局数组保存uid在线数据
$uidConnectionMap = array();

// PHPSocketIO服务
$sender_io = new SocketIO(2120);
// 客户端发起连接事件时，设置连接socket的各种事件回调
$sender_io->on('connection', function ($socket) {
    // 当客户端发来登录事件时触发
    $socket->on('login', function ($uid) use ($socket) {
        global $uidConnectionMap;
        // 已经登录过了
        if (isset($socket->uid)) {
            return;
        }
        // 更新对应uid的在线数据
        $uid = (string)$uid;
        if (!isset($uidConnectionMap[$uid])) {
            $uidConnectionMap[$uid] = 0;
        }

        // 将这个连接加入到uid分组，方便针对uid推送数据
        $socket->join($uid);
        $socket->uid = $uid;
    });

    // 当客户端断开连接是触发（一般是关闭网页或者跳转刷新导致）
    $socket->on('disconnect', function () use ($socket) {
        if (!isset($socket->uid)) {
            return;
        }
        global $sender_io;

    });
});
// 当$sender_io启动后监听一个udp端口，通过这个端口可以给任意uid或者所有uid推送数据
$sender_io->on('workerStart', function () {
    // 监听一个udp端口
    $inner_udp_worker = new Worker('udp://0.0.0.0:2121');
    // 当http客户端发来数据时触发
    $inner_udp_worker->onMessage = function ($http_connection, $data) {
        global $uidConnectionMap;
        $_POST = json_decode($data, true);
        $_POST['type'] = "publish";
        switch (@$_POST['type']) {
            case 'publish':
                global $sender_io;
                $to = @$_POST['client_id'];
                if ($to) {
                    $sender_io->to($to)->emit('new_msg', json_encode($_POST['logs'], JSON_UNESCAPED_UNICODE));
                    // 否则向所有uid推送数据
                } else {
                    $sender_io->emit('new_msg', json_encode(@$_POST['logs'], JSON_UNESCAPED_UNICODE));
                }
                if ($to && !isset($uidConnectionMap[$to])) {
                    return $http_connection->send('offline');
                } else {
                    return $http_connection->send('ok');
                }
        }
        return $http_connection->send('fail');
    };
    // 执行监听
    $inner_udp_worker->listen();

});
if (!defined('GLOBAL_START')) {
    Worker::runAll();
}